package com.sgq.vue.utils.system;

import com.sgq.vue.entity.system.Permission;
import com.sgq.vue.entity.resource.City;
import com.sgq.vue.vo.RouterVo;
import org.springframework.beans.BeanUtils;

import java.util.ArrayList;
import java.util.Comparator;
import java.util.List;
import java.util.Optional;
import java.util.stream.Collectors;

/**
 * @author: 83778
 * @date: 2023-10-31 17:17
 * @desc:
 */
public class MenuTree {

    /**
     *
     * @param menuList
     * @param pid
     * @return
     */
    public static List<RouterVo> makeRouter(List<Permission> menuList, Long pid){
        //创建集合保存路由信息
        List<RouterVo> routerVoList = new ArrayList<RouterVo>();
        //判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(menuList).orElse(new ArrayList<Permission>())
        //筛选不为空的菜单及与菜单父ID相同的数据
                .stream()
                .filter(item -> item != null && item.getParentId() == pid)
                .sorted(Comparator.comparing(Permission::getOrderNum))
                .forEach(item ->{
                    //创建路由信息对象
                    RouterVo routerVo = new RouterVo();
                    //路由名称
                    routerVo.setName(item.getName());
                    //路由地址
                    routerVo.setPath(item.getPath());
                    //判断当前菜单是否是一级菜单
                    if(item.getParentId() == 0L){
                        routerVo.setComponent("Layout"); //一级菜单组件
                        routerVo.setAlwaysShow (true);//显示路出
                    }else {
                        routerVo.setComponent(item.getUrl());
                    }
                    routerVo.setMeta(routerVo.new Meta(item.getLabel(),item.getIcon(),item.getCode().split(",")));
                    //递归生成路由
                    List<RouterVo> children = makeRouter(menuList,item.getId());
                    //子菜单
                    routerVo.setChildren(children);
                    routerVoList.add(routerVo);
                });
        return routerVoList;
    }

    /**
     *
     * @param menuList
     * @param pid
     * @return
     */
    public static List<Permission> makeMenuTree(List<Permission> menuList , Long pid){
        //创建集合保存菜单数据
        List<Permission> permissionList = new ArrayList<Permission>();
        //判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
         Optional.ofNullable(menuList)
                 .orElse(new ArrayList<Permission>())
                 .stream()
                  //先找到1级菜单
                 .filter(item -> item !=null && item.getParentId() == pid)
                 .forEach(item ->{
        //创建权限菜单对象
        Permission permission = new Permission();
        //将原有的属性复制给菜单对象
        BeanUtils.copyProperties(item , permission);
        //获取每一个item对象的子菜单，递归生成菜单树
        List<Permission> children = makeMenuTree(menuList,item.getId());
        permission.setChildren(children);
        //将菜单对象添加到集合
        permissionList.add(permission);
        });
        //返回菜单信息
        return permissionList;
    }

    public static List<City> makeCityTree(List<City> cities , Long pid){
        //创建集合保存菜单数据
        List<City> cityList = new ArrayList<City>();
        //判断菜单列表是否为空，如果不为空则使用菜单列表，否则创建集合对象
        Optional.ofNullable(cities)
                .orElse(new ArrayList<City>())
                .stream()
                //先找到1级菜单
                .filter(item ->  item != null && item.getLeaderCode().equals(pid) )
                .forEach(item ->{
                    //创建城市菜单对象
                    City city = new City();
                    //将原有的属性复制给菜单对象
                    BeanUtils.copyProperties(item , city);
                    //获取每一个item对象的子菜单，递归生成菜单树
                    List<City> children = makeCityTree(cities,item.getId());

                    city.setChildren(children);
                    city.setHasChildren(children.size() > 0 ? true : false);
                    //将菜单对象添加到集合
                    cityList.add(city);
                });
        //返回菜单信息
        return cityList;
    }

}
